package com.tedu.api.ee;

import org.junit.Test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;

/**
 * 流---传输数据---传输数据过程绝对不能出错【处理手段】
 * 标准流结合异常---标准IO
 *
 * 异常
 * java面向对象语言，程序中所出现的所有错误，定义为对象【处理对应错误】
 *
 * Throwable顶级异常超类
 *
 * Exception异常：描述程序级别的错误--有解决方案
 *               编译期：--RunTimeException异常表示类
 *                    FileOutputStream创建对象---波浪线--抛出方法之外
 *              检查异常：通常都是编译器检查处理，程序直接报错，抛出
 *              解决方法：①捕获异常（*）
 *                       ②抛出异常---抛出方法之外--打印控制台
 *              运行期：控制台直接显示异常对象【异常对象名字，产生原因】
 *              非检查异常：控制台输出异常对象名称，RunTimeException异常表示
 *
 *              最后了解【throw与throws---RunTimeException】
 *
 * Error错误：描述系统级别的错误---出现---程序宕机
 *           非常低---->递归：自己调自己【方法】--->
 */
public class EE {
    /**
     * Error 错误---程序严重错误
     * 模拟：方法调方法--栈溢出错误
     * StackOverflowError栈溢出错误
     * ---程序宕机---
     * while(true){
     *    拼接字符串对象
     * }
     */
    public static void method(){
        method();
    }
    @Test
    public void testError(){
        EE.method();
    }

    /**
     * Exception异常：检查异常【出现编译期】---代码报波浪线
     *              两种处理手段：①捕获异常：记录错误---产生异常原因
     *                       语法：try{
     *                           怀疑代码可能有异常或者提示异常
     *                       }catch(小异常名字 e){
     *                          e.printStacktrace(); 打印异常信息
     *                       }catch(中异常名字 e){
     *                          e.printStacktrace(); 打印异常信息
     *                       }catch(大异常名字 e){   Exception
     *                          e.printStacktrace(); 打印异常信息
     *                       }finally{
     *                           一定执行的代码块
     *                       }
     *                    快捷键：ctrl+alt+T
     *
     *                     ②抛出异常 throws 异常名字
     *                     考试题：throw与throws
     *                     异常关键字：throw
     *                               throws
     *               非检查异常【出现运行期】---代码无错误--控制台
     *
     * -----------------
     * 异常：FileNotFoundException  文件不存在异常
     * 产生原因：路径写错，文件名写错
     * 异常：NullPointerException  空指针异常
     * 产生原因：获取字符串为空，数组：值为空，集合：元素为空【存在null值】
     * 异常：StringIndexOutBoundsException  字符串下标越界异常
     * 产生原因：字符串下标没有对应的字符
     * 异常：NumberFormatException  数字转换异常
     * 产生原因：字符串不是正确的类型
     */
    @Test
    public void testException() throws FileNotFoundException {
        //检查异常【出现编译期】---代码报波浪线
      //  FileOutputStream fis=new FileOutputStream("");
        //非检查异常【出现运行期】---控制台
       try{ String str="a";
        str.length();
        str.charAt(1);
        Integer.parseInt(str);//解析字符串--转换为对应类型
    }catch(StringIndexOutOfBoundsException e){
        e.printStackTrace();// 打印异常信息
           System.out.println("字符串小异常：下标越界正常~~");
    }catch(NumberFormatException e){
           e.printStackTrace(); //打印异常信息
           System.out.println("字符串小异常~~");
    }catch(Exception e){
           e.printStackTrace(); //打印异常信息
           System.out.println("大异常~~");
       }
       finally{
           System.out.println();
       }
    }

    /**
     * 作业1.写出五个【非检查】异常的代码示例
     * 提示：查API----java.lang.异常
     *      字符串，包装类，集合，IO流
     */
    @Test
    public void testHomework1() throws IllegalAccessException, FileNotFoundException {
        //1.算数异常
        try{
            int result =10/0;
        }catch(ArithmeticException e){
            System.out.println(e);
        }
        //2.空指针异常
        String str=null;
        int length=str.length();
        //3.非法参数异常
       // public void divide(int divisor){
       //     if(divisor ==0){
       //         throw new IllegalAccessException("");
       //     }
       // }
        //4.类转换异常
        Object obj="Hello";
        Integer num=(Integer) obj;
        //5.文件未找到异常
        File file=new File("nonexistent.txt");
        FileInputStream fis=new FileInputStream(file);
    }
}
